<?php
/**
 * アプリケーションクラス
 *
 * @author tanaka
 * @package App
 */
class App
{
	/**
	 * @var Application
	 */
	private static $_instance;

	/**
	 * @var Zend_Config
	 */
	private $_config;

	/**
	 * 【開発用】例外プラグインを追加
	 *
	 * @todo 開発時のみ使用すること 最終的に消したい
	 * @param Exception $ex
	 * @return void
	 */
	public static function Debug_addExceptionPlugin(Exception $ex)
	{
		if (_DEBUG) {
			Zend_Controller_Front::getInstance()->registerPlugin(new Controller_Plugin_Debug_Exception($ex));
		}
	}

	/**
	 * コンストラクタ
	 *
	 * @return void
	 */
	protected function __construct()
	{
		$defaultConfig = new Zend_Config_Ini(APPLICATION_PATH . '/configs/default.ini');
		$defaultConfig = $defaultConfig->toArray();

		// 個人用設定ファイルの読み込み
		$host = trim(php_uname('n'));
		$filename = APPLICATION_PATH . '/configs/' . $host . '.ini';

		if (file_exists($filename)) {
			$userConfig = new Zend_Config_Ini($filename);
			$defaultConfig = array_merge($defaultConfig, $userConfig->toArray());
		}

		$this->_config = new Zend_Config($defaultConfig);
	}

	/**
	 * インスタンスを取得します。
	 *
	 * @return App
	 */
	public static function getInstance()
	{
		if (!isset(self::$_instance)) {
			self::$_instance = new self();
		}

		return self::$_instance;
	}

	/**
	 * 設定の取得
	 *
	 * @return Zend_Config
	 */
	public function getConfig()
	{
		return $this->_config;
	}

	/**
	 * 設定の取得
	 * @param string $name
	 * @return Zend_Config|null
	 */
	public function __get($name)
	{
		return $this->_config->$name;
	}

	/**
	 * 個人用ファイルの読み込み
	 *
	 * @return
	 */
	public function readPersonalPHPFile()
	{
		$host = trim(php_uname('n'));
		$filename = APPLICATION_PATH . '/personal/' . $host . '.php';
		if (file_exists($filename)) {
			require_once $filename;
		}
	}

	/**
	 * バックエンド側にアクセス可能か返します。
	 *
	 * @param string $ipAddr
	 * @return bool
	 */
	public function isAllowBack($ipAddr){

		$config = $this->getConfig()->back;

		if(!$config->isBlock)return true;

		$whiteList = $config->allowHost->toArray();

		$ipAddr = trim($ipAddr);

		foreach($whiteList as $allowIp){
			if(trim($allowIp) == $ipAddr) return true;
		}

		return false;
	}

	/**
	 * 小ウィンドウで開いてるコントローラーとアクション定義
	 * アクションをnull指定で全部
	 *
	 * @var array
	 */
	protected $_childWindowControllerActions = array();

	/**
	 * 小ウィンドウで開いてるか判定
	 *
	 * @param string $requestController
	 * @param string $requestAction
	 * @return bool
	 */
	public function isChildWindow($requestController, $requestAction)
	{
		foreach ($this->_childWindowControllerActions as $controller => $action) {
			if (preg_match('/^' . $controller . '$/i', $requestController)) {

				if (!is_array($action) || count($action) === 0) {
					return true;
				}

				foreach ($action as $act) {
					if (preg_match('/^' . $act . '$/i', $requestAction)) {
						return true;
					}
				}
			}
		}
		return false;
	}
}
